#include "mat.h"

void MatSet(int x, int y, bool v, Mat* m){
    m->v[y][x] = v;
}

bool MatVal(int x, int y, Mat* m){
    if(x>=0 && x<m->l && y>=0 && y<m->h){
        return m->v[y][x];}
    return 0;
}

Mat* MatAlloc(int h, int l){
    Mat *m = malloc(sizeof(Mat));
    m->v = malloc(sizeof(bool*)*h);
    m->h=h;
    m->l=l;
    int i,j;
    for(i=0 ; i<h ; i++){
        m->v[i]=malloc(sizeof(bool)*l);
        for(j=0 ; j<l ; j++) MatSet(j,i,FAUX,m);
    }
    return m;
}

void MatFree(Mat* m){
    int i=0;
    for(i=0 ; i<m->h ; i++){
        free(m->v[i]);
    }
    free(m->v);
}

void MatSauve(char *nomfichier, Mat* m){
    FILE *fichier = fopen(nomfichier,"w+");
    int i,j;
    for(i=0 ; i<m->h ; i++){
        for(j=0 ; j<m->l ; j++){
            fputc('0'+MatVal(j,i,m),fichier);
        }
        fputc('\n',fichier);
    }
    fclose(fichier);
}

Mat* MatLit(char *nomfichier){
    Mat *matrice;
    FILE *fichier = fopen(nomfichier,"r");
    char buff = fgetc(fichier);
    int h=0,l=0;
    while(buff!='\n' && buff!=EOF){
        buff = fgetc(fichier);
        l++;
    }
    while(buff!=EOF){
        h++;
        while(buff != '\n' && buff != EOF) buff = fgetc(fichier);
        buff=fgetc(fichier);
    }
    rewind(fichier);

    matrice = MatAlloc(h,l);

    int i,j;
    for(i=0 ; i<h ; i++){
        for(j=0 ; j<l ; j++){
            MatSet(j,i,fgetc(fichier)!='0',matrice);
        }
        fgetc(fichier);
    }
    return matrice;
}

void MatCadre(Mat* m){
    int i;
    for(i=0 ; i < m->l ; i++){
        MatSet(i,0,VRAI,m);
        MatSet(i,m->h-1,VRAI,m);
    }
    for(i=0 ; i < m->h ; i++){
        MatSet(0,i,VRAI,m);
        MatSet(m->l-1,i,VRAI,m);
    }
}

